package modelo;

import ar.uba.fi.algo3.titiritero.Posicionable;
import geometria.Coordenada;
import geometria.Rectangulo;
import geometria.Segmento;

/**
 * 
 * Clase abstracta madre de todas las pistas
 * 
 */
public abstract class Pista implements Posicionable {
	protected Coordenada posicion;
	protected Rectangulo limites;
	protected Double maxPeso;
	protected Double maxCarreteo;
	protected Double angulo;
	protected Double ancho;
	protected Double largo;

	public Boolean soportaCarreteo(Double cuanto) {
		return (cuanto <= this.maxCarreteo);
	}

	public Boolean soportaPeso(Double p) {
		return (p <= this.maxPeso);
	}

	/**
	 * @return devuelve true si la recta trazada desde origen hasta destino
	 *         interseca la recta que representa la cabecera
	 */
	public abstract boolean esAproximacionValida(Coordenada origen,
			Coordenada destino);

	/**
	 * 
	 * @param pos
	 *            centro de la pista
	 * @param rotacion
	 *            angulo de rotacion
	 * @return un rectangulo que representa el area de la pista
	 */
	protected void generarLimites(Coordenada pos, Double rotacion) {
		this.limites = new Rectangulo(pos.getX() - this.ancho / 2, pos.getY()
				- this.largo / 2, this.ancho, this.largo);
		this.limites.rotar(rotacion);

	}

	public Double getMaxCarreteo() {
		return this.maxCarreteo;
	}

	public Double getMaxPeso() {
		return this.maxPeso;
	}

	public Double getAngulo() {
		return this.angulo;
	}

	public Boolean contieneAlPunto(Coordenada c) {
		return this.limites.contiene(c);
	}

	public Coordenada getPosicion() {
		return this.posicion;
	}

	@Override
	public String toString() {
		StringBuilder result = new StringBuilder();
		String NEW_LINE = System.getProperty("line.separator");
		result.append(this.getClass().getName() + NEW_LINE);
		result.append("max peso" + this.maxPeso.toString() + NEW_LINE);
		result.append("max carreteo" + this.maxCarreteo.toString() + NEW_LINE);
		result.append("angulo" + this.angulo.toString() + NEW_LINE);
		result.append("ancho" + this.ancho.toString() + NEW_LINE);
		result.append("largo" + this.largo.toString() + NEW_LINE);
		result.append("limites" + this.limites.toString() + NEW_LINE);
		return result.toString();

	}

	abstract public Segmento getCabecera();

	public int getX() {
		return this.limites.getXSupIzq().intValue();
	}

	public int getY() {
		return this.limites.getYSupIzq().intValue();
	}
}
